/*
 * 
 * Uniform v1.0 Copyright © 2009 Josh Pyles / Pixelmatrix Design LLC
 * http://pixelmatrixdesign.com
 * 
 * Requires jQuery 1.3 or newer
 * 
 * Much thanks to Thomas Reynolds and Buck Wilson for their help and advice on
 * this
 * 
 * License: MIT License - http://www.opensource.org/licenses/mit-license.php
 * 
 * Usage:
 * 
 * $(function(){
 * 
 * $("select, :radio, :checkbox").uniform();
 * 
 * });
 * 
 * You can customize the classes that Uniform uses:
 * 
 * $("select, :radio, :checkbox").uniform({ selectClass: 'mySelectClass',
 * radioClass: 'myRadioClass', checkboxClass: 'myCheckboxClass', checkedClass:
 * 'myCheckedClass', focusClass: 'myFocusClass' });
 * 
 * Enjoy!
 * 
 */

(function($) {
	$.uniform = {
		options : {
			selectClass : 'selector',
			radioClass : 'radio',
			checkboxClass : 'checker',
			checkedClass : 'checked',
			focusClass : 'focus'
		}
	};

	if ($.browser.msie && $.browser.version < 7) {
		$.selectOpacity = false;
	} else {
		$.selectOpacity = true;
	}

	$.fn.uniform = function(options) {

		options = $.extend($.uniform.options, options);

		function doSelect(elem) {

			var divTag = $('<div />'), spanTag = $('<span />');

			divTag.addClass(options.selectClass);

			spanTag.html(elem.children(":selected").text());

			elem.css('opacity', 0);
			elem.wrap(divTag);
			elem.before(spanTag);

			// redefine variables

			divTag = elem.parent("div");
			spanTag = elem.siblings("span");

			elem.change(function() {
						spanTag.text(elem.children(":selected").text());
					}).focus(function() {
						divTag.addClass(options.focusClass);
					}).blur(function() {
						divTag.removeClass(options.focusClass);
					});
		}

		function doCheckbox(elem) {

			var divTag = $('<div />'), spanTag = $('<span />');

			divTag.addClass(options.checkboxClass);

			// wrap with the proper elements
			$(elem).wrap(divTag);
			$(elem).wrap(spanTag);

			// redefine variables

			spanTag = elem.parent();
			divTag = spanTag.parent();

			// hide normal input and add focus classes
			$(elem).css("opacity", 0).focus(function() {

						divTag.addClass(options.focusClass);
					}).blur(function() {

						divTag.removeClass(options.focusClass);
					}).click(function() {

						if (!$(elem).attr("checked")) {
							// box was just unchecked, uncheck span
							spanTag.removeClass(options.checkedClass);
						} else {
							// box was just checked, check span
							spanTag.addClass(options.checkedClass);
						}
					});

			// handle defaults
			if ($(elem).attr("checked")) {
				// box is checked by default, check our box
				spanTag.addClass(options.checkedClass);
			}
		}

		function doRadio(elem) {

			var divTag = $('<div />'), spanTag = $('<span />');

			divTag.addClass(options.radioClass);

			// wrap with the proper elements
			$(elem).wrap(divTag);
			$(elem).wrap(spanTag);

			// redefine variables

			spanTag = elem.parent();
			divTag = spanTag.parent();

			// hide normal input and add focus classes
			$(elem).css("opacity", 0).focus(function() {
						divTag.addClass(options.focusClass);
					}).blur(function() {
						divTag.removeClass(options.focusClass);
					}).click(function() {
				if (!$(elem).attr("checked")) {
					// box was just unchecked, uncheck span
					spanTag.removeClass(options.checkedClass);
				} else {
					// box was just checked, check span
					$("." + options.radioClass + " span."
							+ options.checkedClass)
							.removeClass(options.checkedClass);
					spanTag.addClass(options.checkedClass);
				}
			});

			// handle defaults
			if ($(elem).attr("checked")) {
				// box is checked by default, check span
				spanTag.addClass(options.checkedClass);
			}
		}

		return this.each(function() {
					if ($.selectOpacity) {
						var elem = $(this);

						if (elem.is("select")) {
							// element is a select
							doSelect(elem);

						} else if (elem.is(":checkbox")) {
							// element is a checkbox
							doCheckbox(elem);

						} else if (elem.is(":radio")) {
							// element is a radio
							doRadio(elem);
						}
					}
				});
	};
})(jQuery);